﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем ТекущийКонтекст;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	УстановитьУсловноеОформление();
	
	НавигационнаяСсылка = "e1cib/app/ОбщаяФорма.Расширения";
	
	Если Не ПравоДоступа("Администрирование", Метаданные) Тогда
		Элементы.СписокРасширенийБезопасныйРежимФлаг.ТолькоПросмотр = Истина;
	КонецЕсли;
	
	Если Не ПравоДоступа("АдминистрированиеРасширенийКонфигурации", Метаданные) Тогда
		Элементы.СписокРасширенийОбновить.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
		Элементы.СписокРасширений.ТолькоПросмотр = Истина;
		Элементы.СписокРасширенийДобавить.Видимость = Ложь;
		Элементы.СписокРасширенийУдалить.Видимость = Ложь;
		Элементы.СписокРасширенийОбновитьИзФайла.Видимость = Ложь;
		Элементы.СписокРасширенийСохранитьКак.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюДобавить.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюУдалить.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюОбновитьИзФайла.Видимость = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюСохранитьКак.Видимость = Ложь;
	КонецЕсли;
	
	Элементы.СписокРасширенийОбщее.Видимость = ОбщегоНазначения.РазделениеВключено() И ПравоДоступа("Администрирование", Метаданные);
	Элементы.СписокРасширенийПолученоИзГлавногоУзлаРИБ.Видимость = ОбщегоНазначения.ЭтоПодчиненныйУзелРИБ();
	Элементы.СписокРасширенийПередаватьВПодчиненныеУзлыРИБ.Видимость = ОбщегоНазначения.ЭтоРаспределеннаяИнформационнаяБаза();
	
	Элементы.ФормаУстановленныеПатчи.Видимость = 
		ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации");
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	УстановитьДоступностьКнопокКомандныхПанелей()
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "ВыполненВыходИзОбластиДанных" 
		Или ИмяСобытия = "ВыполненВходВОбластьДанных" Тогда
		
		ПодключитьОбработчикОжидания("ОбновитьСписокОбработчикОжидания", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ПредупреждениеОписаниеОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ЗавершитьРаботуСистемы(Ложь, Истина);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписокРасширений

&НаКлиенте
Процедура СписокРасширенийПриАктивизацииСтроки(Элемент)
	
	УстановитьДоступностьКнопокКомандныхПанелей();
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
	
	Отказ = Истина;
	ЗагрузитьРасширение(Неопределено, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПередУдалением(Элемент, Отказ)
	
	Отказ = Истина;
	УдалитьРасширения(Элемент.ВыделенныеСтроки);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийБезопасныйРежимФлагПриИзменении(Элемент)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	Если ТекущееРасширение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ИдентификаторСтроки", ТекущееРасширение.ПолучитьИдентификатор());
	
	ПоказатьДлительнуюОперацию();
	ТекущийКонтекст = Контекст;
	ПодключитьОбработчикОжидания("СписокРасширенийБезопасныйРежимФлагПриИзмененииЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПодключатьПриИзменении(Элемент)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	Если ТекущееРасширение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ИдентификаторСтроки", ТекущееРасширение.ПолучитьИдентификатор());
	
	Если Не ТекущееРасширение.Подключать
	   И ЭтоРасширениеСДанными(ТекущееРасширение.ИдентификаторРасширения) Тогда
		
		Оповещение = Новый ОписаниеОповещения("ОтключитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст);
		
		ПараметрыФормы = Новый Структура;
		ПараметрыФормы.Вставить("Ключ", "ПередОтключениемРасширенияСДанными");
		
		ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы,,,,, Оповещение)
	Иначе
		СписокРасширенийПодключатьПриИзмененииПродолжение(Контекст);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПередаватьВПодчиненныеУзлыРИБПриИзменении(Элемент)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	Если ТекущееРасширение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	СписокРасширенийПередаватьВПодчиненныеУзлыРИБПриИзмененииНаСервере(ТекущееРасширение.ПолучитьИдентификатор());
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Обновить(Команда)
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКак(Команда)
	
	ВыделенныеСтроки = Элементы.СписокРасширений.ВыделенныеСтроки;
	ОписаниеОповещения = Новый ОписаниеОповещения("СохранитьКакЗавершение", ЭтотОбъект, ВыделенныеСтроки);
	
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	ИначеЕсли ВыделенныеСтроки.Количество() = 1 Тогда
		СохраняемыеФайлы = СохранитьНаСервере(ВыделенныеСтроки);
	Иначе
		Заголовок = НСтр("ru = 'Выберите каталог для сохранения расширений конфигурации'");
		ФайловаяСистемаКлиент.ВыбратьКаталог(ОписаниеОповещения, Заголовок);
		Возврат;
	КонецЕсли;
	
	Если СохраняемыеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Диалог.Заголовок = НСтр("ru = 'Выберите файл для сохранения расширения конфигурации'");
	ПараметрыСохранения.Диалог.Фильтр    = НСтр("ru = 'Файлы расширений конфигурации (*.cfe)|*.cfe'") + "|"
			+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Все файлы (%1)|%1'"), ПолучитьМаскуВсеФайлы());
	
	ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьИзФайлаНаДиске(Команда)
	
	ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
	
	Если ТекущееРасширение = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ЗагрузитьРасширение(Элементы.СписокРасширений.ВыделенныеСтроки);
	
КонецПроцедуры

&НаКлиенте
Процедура ПоказатьСобытияФоновогоОбновленияПараметровРаботыРасширений(Команда)
	
	ОтборСобытий = Новый Структура;
	ОтборСобытий.Вставить("СобытиеЖурналаРегистрации", ИмяСобытияЗаполненияПараметров());
	
	ЖурналРегистрацииКлиент.ОткрытьЖурналРегистрации(ОтборСобытий, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗапуститьОбновлениеПараметровРаботыРасширенийВФоне(Команда)
	
	ТекстПредупреждения = "";
	ЗапуститьОбновлениеПараметровРаботыРасширенийВФонеНаСервере(ТекстПредупреждения);
	
	ПоказатьПредупреждение(, ТекстПредупреждения);
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьУстаревшиеПараметровРаботыРасширений(Команда)
	
	УдалитьУстаревшиеПараметрыРаботыРасширенийНаСервере();
	ПоказатьПредупреждение(, НСтр("ru = 'Выполнено удаление устаревших версий параметров работы расширений.'"));
	
КонецПроцедуры

&НаКлиенте
Процедура УстановленныеПатчи(Команда)
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда
		МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент");
		МодульОбновлениеКонфигурацииКлиент.ПоказатьУстановленныеИсправления();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ОбновитьСписокОбработчикОжидания()
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаСервере
Процедура ОбновитьСписок(ПослеДобавления = Ложь)
	
	Если ПослеДобавления Тогда
		ИндексТекущейСтроки = СписокРасширений.Количество();
	Иначе
		ИндексТекущейСтроки = 0;
		ИдентификаторТекущейСтроки = Элементы.СписокРасширений.ТекущаяСтрока;
		Если ИдентификаторТекущейСтроки <> Неопределено Тогда
			Строка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторТекущейСтроки);
			Если Строка <> Неопределено Тогда
				ИндексТекущейСтроки = СписокРасширений.Индекс(Строка);
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	СписокРасширений.Очистить();
	
	УстановитьПривилегированныйРежим(Истина);
	Расширения = РасширенияКонфигурации.Получить();
	ПодключенныеРасширения = ИдентификаторыРасширений(ИсточникРасширенийКонфигурации.СеансАктивные);
	ОтключенныеРасширения  = ИдентификаторыРасширений(ИсточникРасширенийКонфигурации.СеансОтключенные);
	УстановитьПривилегированныйРежим(Ложь);
	
	МодульОбновлениеКонфигурации = Неопределено;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда 
		МодульОбновлениеКонфигурации = ОбщегоНазначения.ОбщийМодуль("ОбновлениеКонфигурации");
	КонецЕсли;
	
	НеВыводитьОбщиеРасширения = ОбщегоНазначения.РазделениеВключено() И Не ПравоДоступа("Администрирование", Метаданные);
	НомерПоПорядку = 1;
	Для Каждого Расширение Из Расширения Цикл
		
		Если НеВыводитьОбщиеРасширения 
			И (Расширение.ОбластьДействия = ОбластьДействияРасширенияКонфигурации.ИнформационнаяБаза) Тогда
			Продолжить;
		КонецЕсли;
			
		Если МодульОбновлениеКонфигурации <> Неопределено И МодульОбновлениеКонфигурации.ЭтоИсправление(Расширение) Тогда 
			Продолжить;
		КонецЕсли;
			
		ЭлементРасширения = СписокРасширений.Добавить();
		ЭлементРасширения.ИдентификаторРасширения = Расширение.УникальныйИдентификатор;
		ЭлементРасширения.Имя = Расширение.Имя;
		ЭлементРасширения.Версия = Расширение.Версия;
		ЭлементРасширения.КонтрольнаяСумма = Base64Строка(Расширение.ХешСумма);
		ЭлементРасширения.Синоним = Расширение.Синоним;
		ЭлементРасширения.Назначение = Расширение.Назначение;
		ЭлементРасширения.БезопасныйРежим = Расширение.БезопасныйРежим;
		ЭлементРасширения.Подключать = Расширение.Активно;
		ЭлементРасширения.ПолученоИзГлавногоУзлаРИБ = Расширение.ГлавныйУзел <> Неопределено;
		ЭлементРасширения.ПередаватьВПодчиненныеУзлыРИБ = Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе;
		ЭлементРасширения.НомерПоПорядку = НомерПоПорядку;
		
		ЭлементРасширения.Общее = (Расширение.ОбластьДействия = ОбластьДействияРасширенияКонфигурации.ИнформационнаяБаза);
		
		ЭлементРасширения.ПриоритетНазначения =
			?(Расширение.Назначение = Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Исправление, 1,
			?(Расширение.Назначение = Метаданные.СвойстваОбъектов.НазначениеРасширенияКонфигурации.Адаптация, 2, 3));
		
		КлючРасширения = Расширение.Имя + Расширение.ХешСумма + Расширение.ОбластьДействия;	
		Если ПодключенныеРасширения[КлючРасширения] <> Неопределено Тогда
			ЭлементРасширения.Подключено = 0;
			ЭлементРасширения.СостояниеПодключения = НСтр("ru = 'Подключено'");
		ИначеЕсли ОтключенныеРасширения[КлючРасширения] <> Неопределено Тогда
			ЭлементРасширения.Подключено = 2;
			ЭлементРасширения.СостояниеПодключения = НСтр("ru = 'Отключено'");
		Иначе
			ЭлементРасширения.Подключено = 1;
			ЭлементРасширения.СостояниеПодключения = НСтр("ru = 'Требуется перезапуск'");
		КонецЕсли;	
			
		Если ПустаяСтрока(ЭлементРасширения.Синоним) Тогда
			ЭлементРасширения.Синоним = ЭлементРасширения.Имя;
		КонецЕсли;
		
		Если ТипЗнч(Расширение.БезопасныйРежим) = Тип("Булево") Тогда
			ЭлементРасширения.БезопасныйРежимФлаг = Расширение.БезопасныйРежим;
		Иначе
			ЭлементРасширения.БезопасныйРежимФлаг = Истина;
		КонецЕсли;
		НомерПоПорядку = НомерПоПорядку + 1;
	КонецЦикла;
	СписокРасширений.Сортировать("ПолученоИзГлавногоУзлаРИБ УБЫВ, ПриоритетНазначения, Общее УБЫВ, НомерПоПорядку");
	
	Если ИндексТекущейСтроки >= СписокРасширений.Количество() Тогда
		ИндексТекущейСтроки = СписокРасширений.Количество() - 1;
	КонецЕсли;
	Если ИндексТекущейСтроки >= 0 Тогда
		Элементы.СписокРасширений.ТекущаяСтрока = СписокРасширений.Получить(
			ИндексТекущейСтроки).ПолучитьИдентификатор();
	КонецЕсли;
	
	УстановитьПривилегированныйРежим(Истина);
	УстановленныеРасширения = Справочники.ВерсииРасширений.УстановленныеРасширения();
	ИзменилосьСостояниеРасширений = 
		(ПараметрыСеанса.УстановленныеРасширения.ОсновныеСостояние <> УстановленныеРасширения.ОсновныеСостояние);
	Элементы.ГруппаПредупреждение.Видимость = ИзменилосьСостояниеРасширений;
	УстановитьПривилегированныйРежим(Ложь);
	
	// Обновление реквизита формы для условного форматирования.
	ЭтоНеразделенныйПользовательВОбласти = ЭтоНеразделенныйПользовательВОбласти();
	
	Элементы.ПредупреждениеОписание.Видимость = Не ЭтоНеразделенныйПользовательВОбласти;
	Элементы.ПредупреждениеОписание2.Видимость = ЭтоНеразделенныйПользовательВОбласти;
	
КонецПроцедуры

&НаСервере
Функция ИдентификаторыРасширений(ИсточникРасширений)
	
	Расширения = РасширенияКонфигурации.Получить(, ИсточникРасширений);
	Идентификаторы = Новый Соответствие;
	
	Для Каждого Расширение Из Расширения Цикл
		Идентификаторы.Вставить(Расширение.Имя + Расширение.ХешСумма + Расширение.ОбластьДействия, Истина);
	КонецЦикла;
	
	Возврат Идентификаторы;
	
КонецФункции

&НаКлиенте
Процедура СохранитьКакЗавершение(ПутьККаталогу, ВыделенныеСтроки) Экспорт
	
	СохраняемыеФайлы = СохранитьНаСервере(ВыделенныеСтроки, ПутьККаталогу);
	
	Если СохраняемыеФайлы.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Интерактивно     = Ложь;
	
	ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);
	
КонецПроцедуры

&НаСервере
Функция СохранитьНаСервере(ИдентификаторыСтрок, ПутьККаталогу = "")
	
	СохраняемыеФайлы = Новый Массив;
	Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		ИдентификаторРасширения = СтрокаСписка.ИдентификаторРасширения;
		Расширение = НайтиРасширение(ИдентификаторРасширения);
	
		Если Расширение <> Неопределено Тогда
			Если ЗначениеЗаполнено(ПутьККаталогу) Тогда
				Префикс = ПутьККаталогу + ПолучитьРазделительПути();
			Иначе
				Префикс = "";
			КонецЕсли;
			Имя = Префикс + Расширение.Имя + "_" + Расширение.Версия + ".cfe";
			Хранение = ПоместитьВоВременноеХранилище(Расширение.ПолучитьДанные(), УникальныйИдентификатор);
			ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(Имя, Хранение);
			СохраняемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
		КонецЕсли;
	КонецЦикла;
	
	Возврат СохраняемыеФайлы;
	
КонецФункции

&НаСервереБезКонтекста
Функция НайтиРасширение(ИдентификаторРасширения)
	
	Возврат Справочники.ВерсииРасширений.НайтиРасширение(ИдентификаторРасширения);
	
КонецФункции

&НаСервере
Процедура ЗапуститьОбновлениеПараметровРаботыРасширенийВФонеНаСервере(ТекстПредупреждения)
	
	УстановитьПривилегированныйРежим(Истина);
	
	РегистрыСведений.ПараметрыРаботыВерсийРасширений.ВключитьЗаполнениеПараметровРаботыРасширений();
	
	ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = '1. Включено и запущено регламентное задание
		           |""%1"".
		           |
		           |2. Результат работы см. в журнале регистрации в событиях
		           |""%2"",
		           |например, с помощью команды в меню Еще
		           |""%3"".'"),
		РегистрыСведений.ПараметрыРаботыВерсийРасширений.НаименованиеЗаданияЗаполненияПараметров(),
		РегистрыСведений.ПараметрыРаботыВерсийРасширений.ИмяСобытияЗаполненияПараметров(),
		Команды.Найти("ЗапуститьОбновлениеПараметровРаботыРасширенийВФоне").Заголовок);
		
КонецПроцедуры

&НаСервере
Процедура УдалитьУстаревшиеПараметрыРаботыРасширенийНаСервере()
	
	УстановитьПривилегированныйРежим(Истина);
	Справочники.ВерсииРасширений.УдалитьУстаревшиеВерсииПараметров();
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРасширения(ВыделенныеСтроки)
	
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	ИдентификаторыРасширений = Новый Массив;
	ПропускаемыеСтроки = Новый Массив;
	
	Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
		СтрокаРасширения = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
		
		Если СтрокаРасширения.Общее
		   И ЭтоНеразделенныйПользовательВОбласти
		 Или СтрокаРасширения.ПолученоИзГлавногоУзлаРИБ Тогда
			
			ПропускаемыеСтроки.Добавить(ИдентификаторСтроки);
			Продолжить;
		КонецЕсли;
		ИдентификаторыРасширений.Добавить(СтрокаРасширения.ИдентификаторРасширения);
	КонецЦикла;
	
	Для Каждого ИдентификаторСтроки Из ПропускаемыеСтроки Цикл
		ВыделенныеСтроки.Удалить(ВыделенныеСтроки.Найти(ИдентификаторСтроки));
	КонецЦикла;
	
	Если ИдентификаторыРасширений.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Контекст = Новый Структура;
	Контекст.Вставить("ИдентификаторыРасширений", ИдентификаторыРасширений);
	
	Оповещение = Новый ОписаниеОповещения("УдалитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("МножественныйВыбор", ИдентификаторыРасширений.Количество() > 1);
	
	Если ЕстьРасширениеСДанными(ИдентификаторыРасширений) Тогда
		ПараметрыФормы.Вставить("Ключ", "ПередУдалениемРасширенияСДанными");
	Иначе
		ПараметрыФормы.Вставить("Ключ", "ПередУдалениемРасширенияБезДанных");
	КонецЕсли;
	
	ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы,,,,, Оповещение)
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРасширениеПослеПодтверждения(Результат, Контекст) Экспорт
	
	Если Результат <> "Продолжить" Тогда
		Возврат;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("УдалитьРасширениеПродолжение", ЭтотОбъект, Контекст);
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
		Запросы = ЗапросыНаОтменуРазрешенийИспользованияВнешнегоМодуля(Контекст.ИдентификаторыРасширений);
		МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент");
		МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(Запросы, ЭтотОбъект, Оповещение);
	Иначе
		ВыполнитьОбработкуОповещения(Оповещение, КодВозвратаДиалога.ОК);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРасширениеПродолжение(Результат, Контекст) Экспорт
	
	Если Результат = КодВозвратаДиалога.ОК Тогда
		ПоказатьДлительнуюОперацию();
		ТекущийКонтекст = Контекст;
		ПодключитьОбработчикОжидания("УдалитьРасширениеЗавершение", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура УдалитьРасширениеЗавершение()
	
	Контекст = ТекущийКонтекст;
	
	Попытка
		УдалитьРасширенияНаСервере(Контекст.ИдентификаторыРасширений);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат;
	КонецПопытки;
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	
КонецПроцедуры

&НаСервере
Процедура УдалитьРасширенияНаСервере(ИдентификаторыРасширений)
	
	ТекстОшибки = "";
	Справочники.ВерсииРасширений.УдалитьРасширения(ИдентификаторыРасширений, ТекстОшибки);
	
	ОбновитьСписок();
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОтключитьРасширениеПослеПодтверждения(Результат, Контекст) Экспорт
	
	Если Результат <> "Продолжить" Тогда
		
		СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(Контекст.ИдентификаторСтроки);
		Если СтрокаСписка = Неопределено Тогда
			Возврат;
		КонецЕсли;
		
		СтрокаСписка.Подключать = Не СтрокаСписка.Подключать;
		Возврат;
	КонецЕсли;
	
	СписокРасширенийПодключатьПриИзмененииПродолжение(Контекст);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПодключатьПриИзмененииПродолжение(Контекст)
	
	ПоказатьДлительнуюОперацию();
	ТекущийКонтекст = Контекст;
	ПодключитьОбработчикОжидания("СписокРасширенийПодключатьПриИзмененииЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийПодключатьПриИзмененииЗавершение()
	
	Контекст = ТекущийКонтекст;
	
	Попытка
		СписокРасширенийПодключатьПриИзмененииНаСервере(Контекст.ИдентификаторСтроки);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат;
	КонецПопытки;
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура СписокРасширенийБезопасныйРежимФлагПриИзмененииЗавершение()
	
	Контекст = ТекущийКонтекст;
	
	Попытка
		СписокРасширенийБезопасныйРежимФлагПриИзмененииНаСервере(Контекст.ИдентификаторСтроки);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат;
	КонецПопытки;
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	
КонецПроцедуры

&НаСервере
Функция ЗапросыНаОтменуРазрешенийИспользованияВнешнегоМодуля(ИдентификаторыРасширений)
	
	Возврат Справочники.ВерсииРасширений.ЗапросыНаОтменуРазрешенийИспользованияВнешнегоМодуля(ИдентификаторыРасширений);
	
КонецФункции

&НаКлиенте
Процедура ПоказатьДлительнуюОперацию()
	
	Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация;
	УстановитьДоступностьКнопокКомандныхПанелей();
	
КонецПроцедуры

&НаКлиенте
Процедура СкрытьДлительнуюОперацию()
	
	Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений;
	УстановитьДоступностьКнопокКомандныхПанелей();
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширение(Знач ИдентификаторРасширения, МножественныйВыбор = Ложь)
	
	Контекст = Новый Структура;
	Контекст.Вставить("ИдентификаторРасширения", ИдентификаторРасширения);
	Контекст.Вставить("МножественныйВыбор", МножественныйВыбор);
	Контекст.Вставить("ВыделенныеСтроки", ИдентификаторРасширения);
	Оповещение = Новый ОписаниеОповещения("ЗагрузитьРасширениеПослеПодтверждения", ЭтотОбъект, Контекст);
	
	ПараметрыФормы = Новый Структура("Ключ", "ПередДобавлениемРасширений");
	
	ОткрытьФорму("ОбщаяФорма.ПредупреждениеБезопасности", ПараметрыФормы,,,,, Оповещение);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширениеПослеПодтверждения(Ответ, Контекст) Экспорт
	Если Ответ <> "Продолжить" Тогда
		Возврат;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("ЗагрузитьРасширениеПослеПомещенияФайлов", ЭтотОбъект, Контекст);
	
	ПараметрыЗагрузки = ФайловаяСистемаКлиент.ПараметрыЗагрузкиФайла();
	ПараметрыЗагрузки.Диалог.Фильтр = НСтр("ru = 'Расширение конфигурации'")+ " (*.cfe)|*.cfe";
	ПараметрыЗагрузки.Диалог.Заголовок = НСтр("ru = 'Выберите файл расширения конфигурации'");
	ПараметрыЗагрузки.Диалог.ПроверятьСуществованиеФайла = Истина;
	
	ПараметрыЗагрузки.ИдентификаторФормы = УникальныйИдентификатор;
	ФайловаяСистемаКлиент.ЗагрузитьФайлы(Оповещение, ПараметрыЗагрузки);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширениеПослеПомещенияФайлов(ПомещенныеФайлы, Контекст) Экспорт
	
	Если ПомещенныеФайлы = Неопределено
	 Или ПомещенныеФайлы.Количество() = 0 Тогда
		
		Возврат;
	КонецЕсли;
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ОбновлениеКонфигурации") Тогда
		МодульОбновлениеКонфигурацииКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ОбновлениеКонфигурацииКлиент");
		
		Если ВыбранныеФайлыСодержатТолькоИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент) Тогда 
			
			ПараметрыРезервногоКопирования = Новый Структура;
			ПараметрыРезервногоКопирования.Вставить("ВыбранныеФайлы", ВыбранныеФайлыПоОписанию(ПомещенныеФайлы));
			МодульОбновлениеКонфигурацииКлиент.ПоказатьПоискИУстановкуОбновлений(ПараметрыРезервногоКопирования);
			Возврат;
			
		ИначеЕсли ВыбранныеФайлыСодержатИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент) Тогда 
			ПоказатьПредупреждение(,
				НСтр("ru = 'Выбранные файлы не должны одновременно содержать исправления (патчи) и другие виды расширений.'"));
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	Контекст.Вставить("ПомещенныеФайлы", ПомещенныеФайлы);
	
	ОповещениеОЗакрытии = Новый ОписаниеОповещения(
		"ЗагрузитьРасширениеПродолжение", ЭтотОбъект, Контекст);
	
	Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
		
		ЗапросыРазрешений = Новый Массив;
		Попытка
			ДобавитьЗапросРазрешений(ЗапросыРазрешений, ПомещенныеФайлы, Контекст.ИдентификаторРасширения);
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
			Возврат;
		КонецПопытки;
		
		МодульРаботаВБезопасномРежимеКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаВБезопасномРежимеКлиент");
		МодульРаботаВБезопасномРежимеКлиент.ПрименитьЗапросыНаИспользованиеВнешнихРесурсов(
			ЗапросыРазрешений, ЭтотОбъект, ОповещениеОЗакрытии);
	Иначе
		ВыполнитьОбработкуОповещения(ОповещениеОЗакрытии, КодВозвратаДиалога.ОК);
	КонецЕсли;
	
КонецПроцедуры

// Параметры:
//  ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла
//  МодульОбновлениеКонфигурацииКлиент - ОбщийМодуль
//
// Возвращаемое значение:
//  Булево
//
&НаКлиенте
Функция ВыбранныеФайлыСодержатИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент)
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл 
		Файл = Новый Файл(ПомещенныйФайл.Имя);
		Если МодульОбновлениеКонфигурацииКлиент.ЭтоИсправление(Файл.Имя) Тогда 
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

// Параметры:
//  ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла
//  МодульОбновлениеКонфигурацииКлиент - ОбщийМодуль
//
// Возвращаемое значение:
//  Булево
//
&НаКлиенте
Функция ВыбранныеФайлыСодержатТолькоИсправления(ПомещенныеФайлы, МодульОбновлениеКонфигурацииКлиент)
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл 
		Файл = Новый Файл(ПомещенныйФайл.Имя);
		Если Не МодульОбновлениеКонфигурацииКлиент.ЭтоИсправление(Файл.Имя) Тогда 
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции

// Параметры:
//   ПомещенныеФайлы - Массив из ОписаниеПереданногоФайла
//
// Возвращаемое значение:
//  Строка
//
&НаКлиенте
Функция ВыбранныеФайлыПоОписанию(ПомещенныеФайлы)
	
	СписокФайлов = Новый Массив;
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл 
		Файл = Новый Файл(ПомещенныйФайл.Имя);
		СписокФайлов.Добавить(Файл.ПолноеИмя);
	КонецЦикла;
	
	Возврат СтрСоединить(СписокФайлов, ", ");
	
КонецФункции

&НаКлиенте
Процедура ЗагрузитьРасширениеПродолжение(Результат, Контекст) Экспорт
	
	Если Результат <> КодВозвратаДиалога.ОК Тогда
		Возврат;
	КонецЕсли;
	
	ПоказатьДлительнуюОперацию();
	ТекущийКонтекст = Контекст;
	ПодключитьОбработчикОжидания("ЗагрузитьРасширениеЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширениеЗавершение()
	
	Контекст = ТекущийКонтекст;
	
	НеподключенныеРасширения = "";
	РасширенияИзменены = Ложь;
	Если Контекст.Свойство("ЗаменаИмениПодтверждена") Тогда
		ПодтверждениеЗаменыИмени = Неопределено;
	Иначе
		ПодтверждениеЗаменыИмени = Новый Структура("СтароеИмя, НовоеИмя", "", "");
	КонецЕсли;
	Попытка
		ИзменитьРасширенияНаСервере(Контекст.ПомещенныеФайлы,
			Контекст.ВыделенныеСтроки, НеподключенныеРасширения, РасширенияИзменены, ПодтверждениеЗаменыИмени);
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
		ПоказатьПредупреждение(, ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Возврат;
	КонецПопытки;
	ПодключитьОбработчикОжидания("СкрытьДлительнуюОперацию", 0.1, Истина);
	
	Если Не Контекст.Свойство("ЗаменаИмениПодтверждена")
	   И ЗначениеЗаполнено(ПодтверждениеЗаменыИмени.СтароеИмя) Тогда
		
		ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Расширение с именем ""%1"" будет заменено на расширение с именем ""%2"".
			           |
			           |Если расширение ""%2"" не является обновлением расширения ""%1"",
			           |тогда следует отказаться от замены и добавить расширение ""%2"", как новое.
			           |Прим.: если расширение ""%2"" не удается добавить из-за расширения ""%1"",
			           |тогда следует сначала удалить расширение ""%1"", а затем добавить ""%2"".'"),
			ПодтверждениеЗаменыИмени.СтароеИмя,
			ПодтверждениеЗаменыИмени.НовоеИмя);
			
		ОбработчикЗавершения = Новый ОписаниеОповещения(
			"ЗагрузитьРасширениеПослеВопросаЗаменыИмени", ЭтотОбъект, Контекст);
		
		Кнопки = Новый СписокЗначений;
		Кнопки.Добавить("Заменить",   НСтр("ru = 'Заменить'"));
		Кнопки.Добавить("НеЗаменять", НСтр("ru = 'Не заменять'"));
		
		ПараметрыВопроса = СтандартныеПодсистемыКлиент.ПараметрыВопросаПользователю();
		ПараметрыВопроса.КнопкаПоУмолчанию = "НеЗаменять";
		ПараметрыВопроса.ПредлагатьБольшеНеЗадаватьЭтотВопрос = Ложь;
		
		СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(ОбработчикЗавершения,
			ТекстВопроса, Кнопки, ПараметрыВопроса);
		Возврат;
	КонецЕсли;
	
	Если Не РасширенияИзменены Тогда
		Возврат;
	КонецЕсли;
	
	Если Контекст.ИдентификаторРасширения = Неопределено Тогда
		Если Контекст.ПомещенныеФайлы.Количество() > 1 Тогда
			ТекстОповещения = НСтр("ru = 'Расширения конфигурации добавлены'");
		Иначе
			ТекстОповещения = НСтр("ru = 'Расширение конфигурации добавлено'");
		КонецЕсли;
	Иначе
		ТекстОповещения = НСтр("ru = 'Расширение конфигурации обновлено'");
	КонецЕсли;
	
	ПоказатьОповещениеПользователя(ТекстОповещения);
	
	Если Не ЗначениеЗаполнено(НеподключенныеРасширения) Тогда
		Возврат;
	КонецЕсли;
	
	Если Контекст.ПомещенныеФайлы.Количество() > 1 Тогда
		Если СтрНайти(НеподключенныеРасширения, ",") > 0 Тогда
			ТекстПредупреждения = НСтр("ru = 'Некоторые расширения не подключаются:'");
		Иначе
			ТекстПредупреждения = НСтр("ru = 'Одно расширение не подключается:'");
		КонецЕсли;
		ТекстПредупреждения = ТекстПредупреждения + " " + НеподключенныеРасширения;
	Иначе
		ТекстПредупреждения = НСтр("ru = 'Расширение не подключается.'");
	КонецЕсли;
	
	ПоказатьПредупреждение(, ТекстПредупреждения);
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьРасширениеПослеВопросаЗаменыИмени(Результат, Контекст) Экспорт
	
	Если Результат = Неопределено
	 Или Результат.Значение <> "Заменить" Тогда
		Возврат;
	КонецЕсли;
	
	Контекст.Вставить("ЗаменаИмениПодтверждена");
	
	ПоказатьДлительнуюОперацию();
	ТекущийКонтекст = Контекст;
	ПодключитьОбработчикОжидания("ЗагрузитьРасширениеЗавершение", 0.1, Истина);
	
КонецПроцедуры

&НаСервере
Процедура ИзменитьРасширенияНаСервере(ПомещенныеФайлы, ИдентификаторыСтрок,
			НеподключенныеРасширения, РасширенияИзменены, ПодтверждениеЗаменыИмени)
	
	Расширение = Неопределено;
	
	ВыделенныеРасширения = Новый Структура;
	Если ИдентификаторыСтрок <> Неопределено Тогда
		Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл
			ДвоичныеДанные = ПолучитьИзВременногоХранилища(ПомещенныйФайл.Хранение);
			ОписаниеРасширения = Новый ОписаниеКонфигурации(ДвоичныеДанные);
			ВыделенныеРасширения.Вставить(ОписаниеРасширения.Имя, ДвоичныеДанные);
		КонецЦикла;
	КонецЕсли;
	
	ПроверяемыеРасширения = Новый Соответствие;
	ДобавленныеРасширения = Новый Массив;
	ИсходныеРасширения    = Новый Соответствие;
	
	ТекстОшибки = "";
	ИмяФайлаДобавляемогоРасширения = Неопределено;
	Попытка
		Если ИдентификаторыСтрок <> Неопределено Тогда
			Для Каждого ИдентификаторСтроки Из ИдентификаторыСтрок Цикл
				СтрокаТаблицы = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
				ИдентификаторРасширения = СтрокаТаблицы.ИдентификаторРасширения;
				Расширение = НайтиРасширение(ИдентификаторРасширения);
				Если Расширение = Неопределено Тогда
					Продолжить;
				КонецЕсли;
				
				ПрежнееИмяРасширения = Расширение.Имя;
				НовоеИмяРасширения = ПрежнееИмяРасширения;
				
				Если Не ВыделенныеРасширения.Свойство(ПрежнееИмяРасширения) Тогда
					Если ИдентификаторыСтрок.Количество() <> 1 Тогда
						Продолжить;
					ИначеЕсли ПодтверждениеЗаменыИмени <> Неопределено Тогда
						ПодтверждениеЗаменыИмени.СтароеИмя = ПрежнееИмяРасширения;
						ПодтверждениеЗаменыИмени.НовоеИмя = ОписаниеРасширения.Имя;
						Возврат;
					Иначе
						НовоеИмяРасширения = ОписаниеРасширения.Имя;
					КонецЕсли;
				КонецЕсли;
				
				ДанныеРасширения = Расширение.ПолучитьДанные();
				ИсходныеРасширения.Вставить(ПрежнееИмяРасширения, ДанныеРасширения);
				
				ОтключитьПредупрежденияБезопасности(Расширение);
				ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
				НовыеДвоичныеДанные = ВыделенныеРасширения[НовоеИмяРасширения];
				Ошибки = Расширение.ПроверитьВозможностьПрименения(НовыеДвоичныеДанные, Ложь);
				Для Каждого Ошибка Из Ошибки Цикл
					Если Ошибка.Важность <> ВажностьПроблемыПримененияРасширенияКонфигурации.Критичная Тогда
						Продолжить;
					КонецЕсли;
					ТекстОшибки = ТекстОшибки + Символы.ПС + Ошибка.Описание;
				КонецЦикла;
				
				Если ЗначениеЗаполнено(ТекстОшибки) Тогда
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Новое расширение не может быть применено по причине:
						           |%1'"),
						ТекстОшибки);
					Прервать;
				Иначе
					Расширение.Записать(НовыеДвоичныеДанные);
					Расширение = НайтиРасширение(ИдентификаторРасширения);
					ПроверяемыеРасширения.Вставить(Расширение.Имя, Расширение.Синоним);
				КонецЕсли;
			КонецЦикла;
		Иначе
			Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл
				ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ПомещенныйФайл.Хранение);
				ОписаниеРасширения = Новый ОписаниеКонфигурации(ДвоичныеДанныеФайла);
				Отбор = Новый Структура("Имя", ОписаниеРасширения.Имя);
				Расширения = РасширенияКонфигурации.Получить(Отбор);
				Если Расширения.Количество() > 0 Тогда
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Нельзя добавить расширение ""%1""
						           |из файла ""%2"",
						           |так как расширение с таким именем уже существует.'"),
						ОписаниеРасширения.Имя,
						ПомещенныйФайл.Имя);
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда
				Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл
					ДвоичныеДанныеФайла = ПолучитьИзВременногоХранилища(ПомещенныйФайл.Хранение);
					ОписаниеРасширения = Новый ОписаниеКонфигурации(ДвоичныеДанныеФайла);
					Расширение = РасширенияКонфигурации.Создать();
					ОтключитьПредупрежденияБезопасности(Расширение);
					ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
					ИмяФайлаДобавляемогоРасширения = ПомещенныйФайл.Имя;
					Расширение.Записать(ДвоичныеДанныеФайла);
					ИмяФайлаДобавляемогоРасширения = Неопределено;
					Расширение = НайтиРасширение(Строка(Расширение.УникальныйИдентификатор));
					ДобавленныеРасширения.Вставить(0, Расширение);
					ПроверяемыеРасширения.Вставить(Расширение.Имя, Расширение.Синоним);
				КонецЦикла;
			КонецЕсли;
		КонецЕсли;
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Если ИдентификаторыСтрок <> Неопределено Тогда
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось обновить расширение по причине:
				           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
			
		ИначеЕсли ЗначениеЗаполнено(ИмяФайлаДобавляемогоРасширения) Тогда
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось добавить расширение ""%1""
				           |из файла ""%2"" по причине:
				           |%3'"),
				ОписаниеРасширения.Имя,
				ИмяФайлаДобавляемогоРасширения,
				ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Иначе
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось добавить по причине:
				           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		КонецЕсли;
	КонецПопытки;
	
	Если Не ЗначениеЗаполнено(ТекстОшибки) Тогда
		Попытка
			РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений(ПроверяемыеРасширения, НеподключенныеРасширения);
			РасширенияИзменены = Истина;
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Возникла непредвиденная ситуация при подготовке добавленных расширений к работе:
				           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		КонецПопытки;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ИнформацияОбОшибкеВосстановления = Неопределено;
		ВосстановлениеВыполнялось = Ложь;
		Попытка
			Если ИдентификаторыСтрок <> Неопределено Тогда
				Для Каждого ПроверяемоеРасширение Из ПроверяемыеРасширения Цикл
					ДанныеРасширения = ИсходныеРасширения[ПроверяемоеРасширение.Ключ];
					Расширение = НайтиРасширение(ИдентификаторРасширения);
					Если Расширение = Неопределено Тогда
						Расширение = РасширенияКонфигурации.Создать();
					КонецЕсли;
					ОтключитьПредупрежденияБезопасности(Расширение);
					ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
					Расширение.Записать(ДанныеРасширения);
				КонецЦикла;
				ВосстановлениеВыполнялось = Истина;
			Иначе
				Для Каждого ДобавленноеРасширение Из ДобавленныеРасширения Цикл
					Отбор = Новый Структура("Имя", ДобавленноеРасширение.Имя);
					Расширения = РасширенияКонфигурации.Получить(Отбор);
					Для Каждого Расширение Из Расширения Цикл
						Если Расширение.ХешСумма = ДобавленноеРасширение.ХешСумма Тогда
							Расширение.Удалить();
							ВосстановлениеВыполнялось = Истина;
						КонецЕсли;
					КонецЦикла;
				КонецЦикла;
			КонецЕсли;
		Исключение
			ИнформацияОбОшибкеВосстановления = ИнформацияОбОшибке();
			Если ИдентификаторыСтрок <> Неопределено Тогда
				ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
					+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Возникла непредвиденная ситуация при попытке восстановить измененное расширение:
						           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления));
			Иначе
				ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
					+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Возникла непредвиденная ситуация при попытке удалить добавленные расширения:
						           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления));
			КонецЕсли;
		КонецПопытки;
		Если ВосстановлениеВыполнялось
		   И ИнформацияОбОшибкеВосстановления = Неопределено Тогда
			
			Если ИдентификаторыСтрок <> Неопределено Тогда
				Если ПроверяемыеРасширения.Количество() > 0 Тогда
					ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
						+ НСтр("ru = 'Измененное расширение было восстановлено.'");
				Иначе
					ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
						+ НСтр("ru = 'Расширение не было изменено.'");
				КонецЕсли;
			Иначе
				ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
					+ НСтр("ru = 'Добавленные расширения были удалены.'");
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
	ОбновитьСписок(ИдентификаторРасширения = Неопределено);
	
КонецПроцедуры

&НаСервере
Процедура СписокРасширенийБезопасныйРежимФлагПриИзмененииНаСервере(ИдентификаторСтроки)
	
	СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если СтрокаСписка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Расширение = НайтиРасширение(СтрокаСписка.ИдентификаторРасширения);
	
	Если Расширение = Неопределено
	 Или Расширение.БезопасныйРежим = СтрокаСписка.БезопасныйРежимФлаг Тогда
		
		ОбновитьСписок();
		Возврат;
	КонецЕсли;
	
	Расширение.БезопасныйРежим = СтрокаСписка.БезопасныйРежимФлаг;
	ОтключитьПредупрежденияБезопасности(Расширение);
	ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
	Попытка
		Расширение.Записать();
	Исключение
		СтрокаСписка.БезопасныйРежимФлаг = Не СтрокаСписка.БезопасныйРежимФлаг;
		ВызватьИсключение;
	КонецПопытки;
	
	Попытка
		РегистрыСведений.ПараметрыРаботыВерсийРасширений.ОбновитьПараметрыРаботыРасширений();
	Исключение
		ИнформацияОбОшибке = ИнформацияОбОшибке();
		Если Расширение.БезопасныйРежим Тогда
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после включения безопасного режима):
				           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		Иначе
			ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Возникла непредвиденная ситуация при подготовке расширений к работе (после отключения безопасного режима):
				           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
		КонецЕсли;
	КонецПопытки;
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ИнформацияОбОшибкеВосстановления = Неопределено;
		Попытка
			Расширение.БезопасныйРежим = Не Расширение.БезопасныйРежим;
			Расширение.Записать();
		Исключение
			ИнформацияОбОшибкеВосстановления = ИнформацияОбОшибке();
			ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
				+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Возникла непредвиденная ситуация при попытке отменить изменение флажка безопасного режима расширения:
					           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибкеВосстановления));
		КонецПопытки;
		Если ИнформацияОбОшибкеВосстановления = Неопределено Тогда
			СтрокаСписка.БезопасныйРежимФлаг = Расширение.БезопасныйРежим;
			ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
				+ НСтр("ru = 'Отменено изменение флажка безопасного режима расширения.'");
		КонецЕсли;
	КонецЕсли;
	
	ОбновитьСписок();
	
	Если ЗначениеЗаполнено(ТекстОшибки) Тогда
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЕстьРасширениеСДанными(ИдентификаторыРасширений)
	
	Для Каждого ИдентификаторРасширения Из ИдентификаторыРасширений Цикл
		Если ЭтоРасширениеСДанными(ИдентификаторРасширения) Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

&НаСервереБезКонтекста
Функция ЭтоРасширениеСДанными(ИдентификаторРасширения)
	
	Расширение = НайтиРасширение(ИдентификаторРасширения);
	
	Если Расширение = Неопределено Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Возврат Расширение.ИзменяетСтруктуруДанных();
	
КонецФункции

&НаСервере
Процедура СписокРасширенийПодключатьПриИзмененииНаСервере(ИдентификаторСтроки)
	
	СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
	Если СтрокаСписка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ТекущееИспользование = СтрокаСписка.Подключать;
	Попытка
		Справочники.ВерсииРасширений.ПереключитьИспользованиеРасширения(СтрокаСписка.ИдентификаторРасширения, ТекущееИспользование);
	Исключение
		СтрокаСписка.Подключать = Не СтрокаСписка.Подключать;
		ОбновитьСписок();
		
		ВызватьИсключение;
	КонецПопытки;
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаСервере
Процедура СписокРасширенийПередаватьВПодчиненныеУзлыРИБПриИзмененииНаСервере(ИдентификаторСтроки)
	
	СтрокаСписка = СписокРасширений.НайтиПоИдентификатору(ИдентификаторСтроки);
	
	Если СтрокаСписка = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Расширение = НайтиРасширение(СтрокаСписка.ИдентификаторРасширения);
	
	Если Расширение <> Неопределено Тогда
	
		Если Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе <> СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ Тогда
			Расширение.ИспользуетсяВРаспределеннойИнформационнойБазе = СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ;
			
			ОтключитьПредупрежденияБезопасности(Расширение);
			ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
			Попытка
				Расширение.Записать();
			Исключение
				СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ = Не СтрокаСписка.ПередаватьВПодчиненныеУзлыРИБ;
				ВызватьИсключение;
			КонецПопытки;
		КонецЕсли;
		
	КонецЕсли;
	
	ОбновитьСписок();
	
КонецПроцедуры

&НаСервере
Процедура ДобавитьЗапросРазрешений(ЗапросыРазрешений, ПомещенныеФайлы, ИдентификаторРасширения = Неопределено)
	
	МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
	Если Не МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности() Тогда
		Возврат;
	КонецЕсли;
	Разрешения = Новый Массив;
	
	Для Каждого ПомещенныйФайл Из ПомещенныеФайлы Цикл
		ДанныеОбновляемогоРасширения = Неопределено;
		ТребуетсяВосстановление = Ложь;
		Попытка
			Если ИдентификаторРасширения = Неопределено Тогда
				ВременноеРасширение = РасширенияКонфигурации.Создать();
			Иначе
				ВременноеРасширение = НайтиРасширение(ИдентификаторРасширения);
				Если ВременноеРасширение = Неопределено Тогда
					ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Расширение с идентификатором %1 не существует в программе, возможно оно было удалено в другом сеансе.'"),
						ИдентификаторРасширения);
				КонецЕсли;
				ДанныеОбновляемогоРасширения = ВременноеРасширение.ПолучитьДанные();
			КонецЕсли;
			ОтключитьПредупрежденияБезопасности(ВременноеРасширение);
			ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(ВременноеРасширение);
			ДанныеРасширения = ПолучитьИзВременногоХранилища(ПомещенныйФайл.Хранение);
			ВременноеРасширение.Записать(ДанныеРасширения);
			ТребуетсяВосстановление = Истина;
			ВременноеРасширение = НайтиРасширение(Строка(ВременноеРасширение.УникальныйИдентификатор));
			СвойстваВременногоРасширения = Новый Структура;
			СвойстваВременногоРасширения.Вставить("Имя",      ВременноеРасширение.Имя);
			СвойстваВременногоРасширения.Вставить("ХешСумма", ВременноеРасширение.ХешСумма);
			Если ИдентификаторРасширения = Неопределено Тогда
				ВременноеРасширение.Удалить();
			Иначе
				ВременноеРасширение = НайтиРасширение(ИдентификаторРасширения);
				Если ВременноеРасширение = Неопределено Тогда
					ВременноеРасширение = РасширенияКонфигурации.Создать();
				КонецЕсли;
				ОтключитьПредупрежденияБезопасности(ВременноеРасширение);
				ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(ВременноеРасширение);
				ВременноеРасширение.Записать(ДанныеОбновляемогоРасширения);
			КонецЕсли;
			ТребуетсяВосстановление = Ложь;
			
			Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля(
				СвойстваВременногоРасширения.Имя, Base64Строка(СвойстваВременногоРасширения.ХешСумма)));
				
		Исключение
			ИнформацияОбОшибке = ИнформацияОбОшибке();
			Если ИдентификаторРасширения = Неопределено Тогда
				Если ПомещенныеФайлы.Количество() > 1 Тогда
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'При получении разрешений не удалось добавить расширение из файла
							           |""%1""
							           |по причине:
							           |%2'"),
							ПомещенныйФайл.Имя,
							ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
				Иначе
					ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
							НСтр("ru = 'При получении разрешений не удалось добавить расширение по причине:
							           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
				КонецЕсли;
			Иначе
				ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'При получении разрешений не удалось обновить расширение по причине:
						           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
			КонецЕсли;
			Если ТребуетсяВосстановление Тогда
				Попытка
					Если ИдентификаторРасширения = Неопределено Тогда
						ВременноеРасширение.Удалить();
					Иначе
						ВременноеРасширение = НайтиРасширение(ИдентификаторРасширения);
						Если ВременноеРасширение = Неопределено Тогда
							ВременноеРасширение = РасширенияКонфигурации.Создать();
						КонецЕсли;
						ОтключитьПредупрежденияБезопасности(ВременноеРасширение);
						ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(ВременноеРасширение);
						ВременноеРасширение.Записать(ДанныеОбновляемогоРасширения);
					КонецЕсли;
				Исключение
					ИнформацияОбОшибке = ИнформацияОбОшибке();
					Если ИдентификаторРасширения = Неопределено Тогда 
						Если ПомещенныеФайлы.Количество() > 1 Тогда
							ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
								+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
									НСтр("ru = 'При получении разрешений добавленное расширение из файла не было удалено
									           |%1
									           |по причине:
									           |%2'"),
									ПомещенныйФайл.Имя,
									ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
						Иначе
							ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
								+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
									НСтр("ru = 'Возникла непредвиденная ситуация при попытке удалить временно добавленное расширение:
									           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
						КонецЕсли;
					Иначе
						ТекстОшибки = ТекстОшибки + Символы.ПС + Символы.ПС
							+ СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
								НСтр("ru = 'Возникла непредвиденная ситуация при попытке восстановить временно измененное расширение:
								           |%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
					КонецЕсли;
				КонецПопытки;
			КонецЕсли;
			ВызватьИсключение ТекстОшибки;
		КонецПопытки;
	КонецЦикла;
	
	УстановленныеРасширения = РасширенияКонфигурации.Получить();
	Для Каждого Расширение Из УстановленныеРасширения Цикл
		Разрешения.Добавить(МодульРаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнегоМодуля(
			Расширение.Имя, Base64Строка(Расширение.ХешСумма)));
	КонецЦикла;
	
	ЗапросыРазрешений.Добавить(МодульРаботаВБезопасномРежиме.ЗапросНаИспользованиеВнешнихРесурсов(Разрешения,
		ОбщегоНазначения.ИдентификаторОбъектаМетаданных("РегистрСведений.ПараметрыРаботыВерсийРасширений")));
	
КонецПроцедуры

&НаСервере
Процедура ОтключитьПредупрежденияБезопасности(Расширение)
	
	Справочники.ВерсииРасширений.ОтключитьПредупрежденияБезопасности(Расширение);
	
КонецПроцедуры

&НаСервере
Процедура ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение)
	
	Справочники.ВерсииРасширений.ОтключитьИспользованиеОсновныхРолейДляВсехПользователей(Расширение);
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()
	
	УсловноеОформление.Элементы.Очистить();
	
	// Оформление ТолькоПросмотр для общих расширений и расширений, полученных в подчиненном узле РИБ из главного.
	
	Элемент = УсловноеОформление.Элементы.Добавить();
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокРасширенийПодключать.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокРасширенийБезопасныйРежимФлаг.Имя);
	
	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.СписокРасширенийПередаватьВПодчиненныеУзлыРИБ.Имя);
	
	ГруппаЭлементовОтбора = Элемент.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
	
	ГруппаЭлементовОтбораОбщее = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаЭлементовОтбораОбщее.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
	
	ОтборЭлемента = ГруппаЭлементовОтбораОбщее.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокРасширений.Общее");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	ОтборЭлемента = ГруппаЭлементовОтбораОбщее.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ЭтоНеразделенныйПользовательВОбласти");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	ОтборЭлемента = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СписокРасширений.ПолученоИзГлавногоУзлаРИБ");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Истина;
	
	Элемент.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);
	
КонецПроцедуры

&НаКлиенте
Процедура УстановитьДоступностьКнопокКомандныхПанелей()
	
	Если Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаДлительнаяОперация Тогда 
		
		Элементы.СписокРасширенийДобавить.Доступность = Ложь;
		Элементы.СписокРасширенийУдалить.Доступность = Ложь;
		Элементы.СписокРасширенийОбновитьИзФайла.Доступность = Ложь;
		
		Элементы.СписокРасширенийКонтекстноеМенюДобавить.Доступность = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюУдалить.Доступность = Ложь;
		Элементы.СписокРасширенийКонтекстноеМенюОбновитьИзФайла.Доступность = Ложь;
		
	ИначеЕсли Элементы.СтраницыОбновление.ТекущаяСтраница = Элементы.СтраницаСписокРасширений Тогда 
		
		ВыбранаОднаСтрока = Элементы.СписокРасширений.ВыделенныеСтроки.Количество() = 1;
		
		РедактированиеДоступно = Истина;
		Если ВыбранаОднаСтрока Тогда 
			ТекущееРасширение = Элементы.СписокРасширений.ТекущиеДанные;
			
			РедактированиеДоступно = (Не ТекущееРасширение.Общее 
				Или Не ЭтоНеразделенныйПользовательВОбласти())
				И Не ТекущееРасширение.ПолученоИзГлавногоУзлаРИБ;
		КонецЕсли;
		
		Элементы.СписокРасширенийДобавить.Доступность = Истина;
		Элементы.СписокРасширенийУдалить.Доступность = РедактированиеДоступно;
		Элементы.СписокРасширенийОбновитьИзФайла.Доступность = РедактированиеДоступно;
		
		Элементы.СписокРасширенийКонтекстноеМенюДобавить.Доступность = Истина;
		Элементы.СписокРасширенийКонтекстноеМенюУдалить.Доступность = РедактированиеДоступно;
		Элементы.СписокРасширенийКонтекстноеМенюОбновитьИзФайла.Доступность = ВыбранаОднаСтрока И РедактированиеДоступно;
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЭтоНеразделенныйПользовательВОбласти()
	
	Возврат СтандартныеПодсистемыСервер.ЭтоРазделенныйРежимСеансаБезРазделителей();
		
КонецФункции

&НаСервереБезКонтекста
Функция ИмяСобытияЗаполненияПараметров()
	
	Возврат РегистрыСведений.ПараметрыРаботыВерсийРасширений.ИмяСобытияЗаполненияПараметров();
	
КонецФункции

#КонецОбласти